#include<stdio.h>
#include<stdlib.h>

//自定义数据结构
typedef struct
{
  int *data;//指向堆区的指针
  size_t size;//有效元素个数
  size_t capacity;//最大容量
}DynamicArr;

//初始化动态数组
void initArr(DynamicArr *arr,size_t initcapacity);
//释放动态内存
void desArr(DynamicArr *arr);
//指定位置插入元素
void insertArr(DynamicArr *arr,size_t index,int element);
//输出动态数组元素
void showArr(DynamicArr *arr);
//结尾插入
void insertend(DynamicArr *arr,int element);
/**
 * @brief 删除指定元素
 * @param arr指向自定义结构体变量的指针
 * @param index为删除元素的下标
 * @return 无
 */
//删除指定位置元素
void removeArr(DynamicArr *arr,size_t index);
//升序排序
void ascsort(DynamicArr *arr);
//扩容
 static void resizeArr(DynamicArr *arr,size_t newcapacity);


int main()
{
    DynamicArr arry;
    initArr(&arry,2);
    //插入元素
    //insertArr(&arry,0,1);
    //insertArr(&arry,1,2);
    //insertArr(&arry,2,3);//需要扩容
    //printf("size:%ld\n",arry.size);
    //printf("capacity:%ld\n",arry.capacity);
    insertend(&arry,45);
    insertend(&arry,62);
    insertend(&arry,15);
    insertend(&arry,78);
    insertend(&arry,38);
    showArr(&arry);
    ascsort(&arry);
    showArr(&arry);
    desArr(&arry);
    return 0;
}

void initArr(DynamicArr *arr,size_t initcapacity)
{
  arr->data=(int *)malloc(initcapacity*sizeof(int));//动态分配内存
  arr->size=0;
  arr->capacity=initcapacity;
}

void desArr(DynamicArr *arr)
{
    free(arr->data);//释放内存
    arr->size=0;
    arr->capacity=0;
    arr->data=NULL;//设空值防止野指针
}

void insertArr(DynamicArr *arr,size_t index,int element)
{
  //插入位置验证
  if(index>arr->size)//可插入在有效元素末尾
  {
    return;
  }
  //判断是否需要扩容
  if(arr->size>=arr->capacity)
  {
    size_t newcapacity=arr->capacity*2;//设置个合理大小
    resizeArr(arr,newcapacity);
  }
  for(size_t i=arr->size;i>index;i--)
  {
    arr->data[i]=arr->data[i-1];
  }
  arr->data[index]=element;
  arr->size++;
}

void resizeArr(DynamicArr *arr,size_t newcapacity)
{
    arr->data=(int*)realloc(arr->data,newcapacity*sizeof(int));
    arr->capacity=newcapacity;
}

void showArr(DynamicArr *arr)
{
    for(int i=0;i<=arr->size;i++)
    {
        printf("%d\n",arr->data[i]);
    }
}

void insertend(DynamicArr *arr,int element)
{
    insertArr(arr,arr->size,element);
}

void removeArr(DynamicArr *arr,size_t index)
{
  if(index>arr->size)
  {
    return ;
  }
  for(size_t i=index;i<arr->size-1;i++)
  {
    arr->data[i]=arr->data[i+1];
  }
  arr->size--;
}

void ascsort(DynamicArr *arr)
{
  int temp=0;
  for(size_t i=0;i<arr->size-1;i++)
  {
    for(size_t j=0;j<arr->size-1-i;j++)
    {
       if(arr->data[j]>arr->data[j+1])
       {
        temp=arr->data[j];
        arr->data[j]=arr->data[j+1];
        arr->data[j+1]=temp;
       }
    }
  }
}